home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / GapText.h < prev    next >
C/C++ Source or Header  |  1990-11-28  |  3KB  |  113 lines

  1. #ifndef GapText_First
  2. #ifdef __GNUG__
  3. #pragma once
  4. #endif
  5. #define GapText_First
  6.  
  7. #include "Text.h"
  8.  
  9. //---- class GapText ------------------------------------------------------
  10.  
  11. typedef class GapText *GapTextPtr;
  12.  
  13. extern char *cMemOverflow;
  14. extern char *cGapTextName;
  15.  
  16. class GapText: public Text  {  
  17.     friend class GapTextIter;
  18.  
  19.     int size;                               // size of allocated memory
  20.     int length;                             // length of text
  21.     int part1len;                           // length of text before gap
  22.     int part2len;                           // redundant
  23.     int gaplen;                             // length of gap
  24.     byte *body;                             // access to text befor gap
  25.     byte *part2body;                        // access to text behind gap
  26.     byte *body2;                            // redundant
  27.  
  28. private:
  29.     void Update(int l)
  30.     {
  31.         part1len= l;
  32.         gaplen= size - length;
  33.         part2body= body + gaplen;
  34.         part2len= length - part1len;
  35.         body2= part2body + part1len;
  36.     }
  37.     void Init(int l, FontPtr fd);
  38.     void Expand(int to = 0, int moveto = cMaxInt);
  39.     void Shrink(int to = 0);
  40.     void MoveGap(int to);
  41.     void CopyTo(byte *dst, int from, int to);
  42.     bool HighWaterMark(int n)
  43.     { return (bool) (body == 0 || gaplen <= n ); }
  44.     bool LowWaterMark()
  45.     { return (bool) (size / 5 > length) ;}
  46.     void CheckPtr(byte *ptr)
  47.     { if (ptr == NULL) Error(cGapTextName, cMemOverflow); }
  48.  
  49. protected:
  50.     byte CharAt(int i)
  51.     { return i < part1len ? body[i] : part2body[i]; } 
  52.     void SetFStringVL(char *fmt, va_list va);
  53.  
  54. public:
  55.     MetaDef(GapText);
  56.  
  57.     GapText(int s = 16, FontPtr fd = gSysFont);
  58.     GapText(byte *buf, int len = -1, bool ic = FALSE, FontPtr fd = gSysFont);
  59.     ~GapText();
  60.  
  61.     //---- editing
  62.     void Cut(int from,int to);
  63.     void Paste(TextPtr paste,int from,int to);
  64.     void Insert(byte c, int from, int to);
  65.     void Copy(Text *save,int from, int to);
  66.     void CopyInStr(byte *str,int strsize,int from, int to);
  67.     void ReplaceWithStr(byte *str, int len = -1);
  68.     byte *GetTextAt(int from, int to);
  69.     TextPtr Save(int from, int to);
  70.     // allocate new text object and copy the given range
  71.  
  72.     //---- accessing
  73.     void Empty (int initSize = 0);
  74.     byte& operator[](int i);
  75.     int Size();
  76.     bool IsEmpty();
  77.     int TextWidth(int from, int to);
  78.     void DrawText(int from, int to, Rectangle clip);
  79.     int Search(class RegularExp *rex,int *nMatched, int start = 0, 
  80.            int range = cMaxInt, bool forward = TRUE);
  81.  
  82.     //---- iterators
  83.     TextIter *MakeIterator(int from = 0, int to = cMaxInt);
  84.  
  85.     //---- generic object methods
  86.     unsigned long Hash();
  87.     bool IsEqual(ObjPtr t);
  88.     bool IsEqualStr (byte *ch);
  89.  
  90.     //---- input/output
  91.     ostream& PrintOn (ostream& s);
  92.     istream& ReadFrom (istream& s);
  93.     ostream& PrintOnAsPureText (ostream &s);
  94.     istream& ReadFromAsPureText (istream& s, long sizeHint= -1);
  95.     void Dump(); // print info for testing
  96. };
  97.  
  98. //---- class GapTextIter --------------------------------------------------
  99.  
  100. class GapTextIter: public TextIter {
  101.     FontPtr font;
  102. public:
  103.     GapTextIter(Text *s,int from = 0 , int to = cMaxInt);
  104.  
  105.     int operator() ();   // returns cEOT at End
  106.     int operator () (int *width,LineDesc*);  // returns width of chars too
  107.     int Line(LineDesc*);            // return position of next line end (\r,\n)
  108.     int Token(int *width,LineDesc*);// returns next token and its size
  109. };
  110.  
  111.  
  112. #endif GapText_First    
  113.